#ifndef _PHC_BEEP_H_
#define _PHC_BEEP_H_

/***********************************************************************
DS には無関係
***********************************************************************/
#define BEEP_EEP		(1)	// DS から音データを送信する場合
#define BEEP_EEP_STATIC	(1)	// EEP サウンドデータを常駐する場合
#define BEEP_TIMER_W	(1)
#define BEEP_MAX_DEVIDE	(96)
/***********************************************************************
DS には無関係
***********************************************************************/
#define USE_BEEP_2PORT	(1) // ブザーに2ポート使うかどうか

#if USE_BEEP_2PORT==0
#define USE_LITTLEVOICE	(1) // 2ポート使って大きな音だすかどうか
#define TW_PWMC			(0)
#else // 2ポートない時は必然的にこちら
#define USE_LITTLEVOICE	(0) // 2ポート使って大きな音だすかどうか
#define TW_PWMC			(1)
#endif

/***********************************************************************
***********************************************************************/
typedef struct{
  unsigned char count;	// 音の長さ
  unsigned char scale;	// 音階
}Note;
/***********************************************************************
***********************************************************************/
#define NOTE_32		(1*3)	// 32分音符
#define NOTE_16		(2*3) // 16分音符
#define NOTE_16H	(3*3) // 16分音符
#define NOTE_8		(4*3) // 8分音符
#define NOTE_8H		(6*3) // 8分音符
#define NOTE_4		(8*3) // 4分音符
#define NOTE_4H		(12*3) // 4分音符
#define NOTE_2		(16*3) // 2分音符
#define NOTE_1		(32*3) // 全音符

#define NOTE_3R		(3) // ３連ぷ
/***********************************************************************
***********************************************************************/
#define NOTE_A1		(0)		// ラ
#define NOTE_A1S	(1)		// ラ#
#define NOTE_B1		(2)		// シ
#define NOTE_C1		(3)		// ド
#define NOTE_C1S	(4)		// ド#
#define NOTE_D1		(5)		// レ
#define NOTE_D1S	(6)		// レ#
#define NOTE_E1		(7)		// ミ
#define NOTE_F1		(8)		// ファ
#define NOTE_F1S	(9)		// ファ#
#define NOTE_G1		(10)	// ソ
#define NOTE_G1S	(11)	// ソ#
#define NOTE_A2		(12)	// ラ
#define NOTE_A2S	(13)	// ラ#
#define NOTE_B2		(14)	// シ
#define NOTE_C2		(15)	// ド
#define NOTE_C2S	(16)	// ド#
#define NOTE_D2		(17)	// レ
#define NOTE_D2S	(18)	// レ#
#define NOTE_E2		(19)	// ミ
#define NOTE_F2		(20)	// ファ
#define NOTE_F2S	(21)	// ファ#
#define NOTE_G2		(22)	// ソ
#define NOTE_G2S	(23)	// ソ#
#define NOTE_A3		(24)	// ラ
#define NOTE_A3S	(25)	// ラ#
#define NOTE_B3		(26)	// シ
#define NOTE_C3		(27)	// ド
#define NOTE_C3S	(28)	// ド#
#define NOTE_D3		(29)	// レ
#define NOTE_D3S	(30)	// レ#
#define NOTE_E3		(31)	// ミ
#define NOTE_F3		(32)	// ファ
#define NOTE_F3S	(33)	// ファ#
#define NOTE_G3		(34)	// ソ
#define NOTE_G3S	(35)	// ソ#
#define NOTE_A4		(36)	// ラ
/***********************************************************************
***********************************************************************/
#define NOTE_DO1	(0)		// ド
#define NOTE_DO1S	(1)		// ド#
#define NOTE_RE1	(2)		// レ
#define NOTE_RE1S	(3)		// レ#
#define NOTE_MI1	(4)		// ミ
#define NOTE_FA1	(5)		// ファ
#define NOTE_FA1S	(6)		// ファ#
#define NOTE_SO1	(7)		// ソ
#define NOTE_SO1S	(8)		// ソ#
#define NOTE_LA2	(9)		// ラ
#define NOTE_LA2S	(10)	// ラ#
#define NOTE_SI2	(11)	// シ
#define NOTE_DO2	(12)	// ド
#define NOTE_DO2S	(13)	// ド#
#define NOTE_RE2	(14)	// レ
#define NOTE_RE2S	(15)	// レ#
#define NOTE_MI2	(16)	// ミ
#define NOTE_FA2	(17)	// ファ
#define NOTE_FA2S	(18)	// ファ#
#define NOTE_SO2	(19)	// ソ
#define NOTE_SO2S	(20)	// ソ#
#define NOTE_LA3	(21)	// ラ
#define NOTE_LA3S	(22)	// ラ#
#define NOTE_SI3	(23)	// シ
#define NOTE_DO3	(24)	// ド
#define NOTE_DO3S	(25)	// ド#
#define NOTE_RE3	(26)	// レ
#define NOTE_RE3S	(27)	// レ#
#define NOTE_MI3	(28)	// ミ
#define NOTE_FA3	(29)	// ファ
#define NOTE_FA3S	(30)	// ファ#
#define NOTE_SO3	(31)	// ソ
#define NOTE_SO3S	(32)	// ソ#
#define NOTE_LA4	(33)	// ラ
#define NOTE_LA4S	(34)	// ラ#
#define NOTE_SI4	(35)	// シ
#define NOTE_DO4	(36)	// ド

#define NOTE_DO4S	(37)	// ド#
#define NOTE_RE4	(38)	// レ
#define NOTE_RE4S	(39)	// レ#
#define NOTE_MI4	(40)	// ミ
#define NOTE_FA4	(41)	// ファ
/***********************************************************************
***********************************************************************/
#define SCALE_MASK	(0x7F)
#define NOTE_SLUR	(0x80)	// スラー(or して使う)
/***********************************************************************
***********************************************************************/
#define NOTE_TEMPO	(0x7B)	// テンポ指定
//#define NOTE_SLUR	(0xFC)	// スラー
#define NOTE_REST	(0x7D)	// 休符

#define NOTE_LOOP	(0x7E)	// 先頭へ(テスト以外使用しないでください)
#define NOTE_END	(0x7F)	// 終了
/***********************************************************************
DS には無関係
***********************************************************************/
#if BEEP_EEP_STATIC==1
#define NOTE_SCALE	(note->scale & SCALE_MASK)
#define SLUR_MASK	(note->scale & NOTE_SLUR)
#define NOTE_COUNT	(note->count)
#else
#define NOTE_SCALE	(note.scale & SCALE_MASK)
#define SLUR_MASK	(note.scale & NOTE_SLUR)
#define NOTE_COUNT	(note.count)
#endif
/***********************************************************************
DS には無関係
***********************************************************************/
extern BOOL BEEP_IsPlaying(void);
extern void BEEP_Init(void);

extern void BEEP_Volume(u8 v);

//extern void BEEP_Start(Note *data);
extern void BEEP_Set(u8 helz);
extern void BEEP_Play(void);
extern void BEEP_Start(u8 kind);
extern void BEEP_Stop(void);

extern void BEEP_Data(Note *data); // 検査用固定データ再生

extern void BEEP_Process(void); //
extern void BEEP_Intr(void); // 16Hz 割り込みから呼ぶ

#endif
